package com.wbs.service;


import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import com.wbs.dao.SysDeptMapper;
import com.wbs.dto.DeptLevelDto;
import com.wbs.model.SysDept;
import com.wbs.util.LevelUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.apache.commons.collections.CollectionUtils;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

@Service
public class SysTreeService {

    @Autowired
    SysDeptMapper sysDeptMapper;

    // 此方法直接可以得到一个部门等级的 Tree
    public List<DeptLevelDto> deptTree() {

        List<SysDept> deptList = sysDeptMapper.getAllDept();  // 查询所有的部门

        List<DeptLevelDto> dtoList = Lists.newArrayList();
        for (SysDept dept : deptList) {
            DeptLevelDto dto = DeptLevelDto.adapt(dept);  // 适配
            dtoList.add(dto);
        }
        return deptListToTree(dtoList);
    }

    public List<DeptLevelDto> deptListToTree(List<DeptLevelDto> deptLevelList) {

        // 适配方法
        if (CollectionUtils.isEmpty(deptLevelList)) {
            return Lists.newArrayList();  // 如果为空的话，直接return一个空的List
        }

        // key 为dept的level,value为Dept的List
        // level -> [dept1,dept2,...]
        // ArrayListMultimap.create()结果是：HashMap<K, Collection<V>>()，value是一个Collection
        Multimap<String, DeptLevelDto> levelDeptMap = ArrayListMultimap.create();

        /*****************处理第一层的ROOT开始********************/

        // 拿出一级的List
        List<DeptLevelDto> rootList = Lists.newArrayList();
        for (DeptLevelDto dto : deptLevelList) {
            levelDeptMap.put(dto.getLevel(), dto);  // 如果有相同level的部门话，得到的结果是 level -> [dept1,dept2...]这样的结果，而不是Hashmap那样，相同的key ,value只能有一个
            if (LevelUtil.ROOT.equals(dto.getLevel())) {  // ROOT 为 0
                rootList.add(dto);
            }
        }

        // 按照 seq 从小到大排序
        Collections.sort(rootList, new Comparator<DeptLevelDto>() {
            @Override
            public int compare(DeptLevelDto o1, DeptLevelDto o2) {
                return o1.getSeq() - o2.getSeq();  // 按照seq排序
            }
        });

        /*****************处理第一层的ROOT结束********************/


        // 递归生成树
        transformDeptTree(rootList, LevelUtil.ROOT, levelDeptMap);  // 递归进行将level培训
        return rootList;


    }

    // 递归排序,参数中 deptLevelList 是当前部门层级列表
    public void transformDeptTree(List<DeptLevelDto> deptLevelList, String level, Multimap<String, DeptLevelDto> levelDeptMap) {

        for (int i = 0; i < deptLevelList.size(); i++) {  // 遍历跟目录层级下的每一个部门
            // 遍历该层的每个元素
            DeptLevelDto deptLevelDto = deptLevelList.get(i);
            // 处理当前的层级
            String nextLevel = LevelUtil.calculataLevel(level, deptLevelDto.getId());
            // 处理下一层级，得到下一层级的所有部门列表
            List<DeptLevelDto> tempDeptList = (List<DeptLevelDto>) levelDeptMap.get(nextLevel);
            if(CollectionUtils.isNotEmpty(tempDeptList)){
                // 排序
                Collections.sort(tempDeptList,deptSeqComparator);
                // 设置下一层部门的列表。
                deptLevelDto.setDeptList(tempDeptList);  // 此处的作用是：将当前部门的下一层级的所有部门列表放到当前的部门中，这样等for循环遍历完成的时候，就可以得到一个树状部门列表
                // 进入到下一层处理。将tempDeptList作为下一次遍历的根部门列表
                transformDeptTree(tempDeptList,nextLevel,levelDeptMap);
            }
        }


    }

    // 比较器，按照seq进行比较
    public Comparator<DeptLevelDto> deptSeqComparator=new Comparator<DeptLevelDto>() {
        @Override
        public int compare(DeptLevelDto o1, DeptLevelDto o2) {
            return o1.getSeq()-o2.getSeq();  // 按照 seq 从小到大的顺序来排序
        }
    };


}
